﻿using Npgsql;
using Real.Datos.Interfaces;
using Real.Entidad;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Text;
using Dapper;
using DapperExtensions;

namespace Real.Datos.Repositories
{
    public interface IProductoRepository : IRepository<Producto>
    {
        Producto FindByIdWithProveedorMarcaCategoria(int producto_id);
    }

    public class ProductoRepository : IProductoRepository
    {
        
        protected readonly IDbConnection _db;

        public ProductoRepository()
        {
            _db = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["REAL"].ToString()); 
        }
        public IList<Producto> FindAll()
        {
            using (IDbConnection _db = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["REAL"].ToString()))
            {
                return _db.Query<Producto>("SELECT * FROM PRODUCTO ORDER BY PRDID ASC").ToList();
            }            
        }

        public IList<Producto> Find(System.Linq.Expressions.Expression<Func<Producto, bool>> predicate)
        {
            throw new NotImplementedException();
        }

        public Producto FindById(int id)
        {
            string query = "SELECT * FROM PRODUCTO WHERE PRDID = " + id;

            using (IDbConnection _db = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["REAL"].ToString()))
            {
                return _db.Query<Producto>(query).SingleOrDefault();
            }
        }

        public int Add(Producto newEntity)
        {
            throw new NotImplementedException();
        }

        public bool Remove(int id)
        {
            throw new NotImplementedException();
        }

        public int Modify(Producto entity)
        {
            throw new NotImplementedException();
        }

        public Producto FindByIdWithProveedorMarcaCategoria(int producto_id)
        {
            string query = "SELECT * FROM PRODUCTO " +
                            "INNER JOIN PROVEEDOR ON PROVEEDOR.PROID = PRODUCTO.PROID " +
                            "INNER JOIN MARCA ON MARCA.MARID = PRODUCTO.MARID " +
                            "INNER JOIN CATEGORIA ON CATEGORIA.CATID = PRODUCTO.CATID " +
                            "WHERE PRODUCTO.PRDID = " + producto_id;

            using (IDbConnection _db = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["REAL"].ToString()))
            {
                return _db.Query<Producto, Proveedor, Marca, Categoria, Producto>(query, 
                    (producto, proveedor, marca, categoria) => { producto.proveedor = proveedor; producto.marca = marca; producto.categoria = categoria; return producto; }, 
                    splitOn: "proid, marid, catid").SingleOrDefault();
            }
        }
    }
}
